package es.decloud.model;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.apache.commons.lang.builder.ToStringBuilder;

@Entity
@Table(name = "aviso")
public class Aviso extends BaseObject implements Serializable {

	private static final long serialVersionUID = 2655133261290765971L;

	private Long id;
	private TipoAviso tipoAviso;
	private TipoImportancia tipoImportancia;
	private Usuario usuario;
	private String tituloAviso;
	private String textoAviso;
	private String url;
	private Date fechaActivacion;
	private Date fechaBaja;
	private Set<UsuarioAviso> destinatarios = new HashSet<>(0);

	public Aviso() {
	}

	public Aviso(TipoAviso tipoAviso, TipoImportancia tipoImportancia, Usuario usuario, String textoAviso) {
		this.tipoAviso = tipoAviso;
		this.tipoImportancia = tipoImportancia;
		this.usuario = usuario;
		this.textoAviso = textoAviso;
	}

	public Aviso(TipoAviso tipoAviso, TipoImportancia tipoImportancia, Usuario usuario, String textoAviso, String url,
			Date fechaActivacion, Date fechaBaja, Set<UsuarioAviso> destinatarios) {
		this.tipoAviso = tipoAviso;
		this.tipoImportancia = tipoImportancia;
		this.usuario = usuario;
		this.textoAviso = textoAviso;
		this.url = url;
		this.fechaActivacion = fechaActivacion;
		this.fechaBaja = fechaBaja;
		this.destinatarios = destinatarios;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id", unique = true, nullable = false)
	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@ManyToOne
	@JoinColumn(name = "tipo_aviso_id", nullable = false)
	public TipoAviso getTipoAviso() {
		return this.tipoAviso;
	}

	public void setTipoAviso(TipoAviso tipoAviso) {
		this.tipoAviso = tipoAviso;
	}

	@ManyToOne
	@JoinColumn(name = "tipo_importancia_id", nullable = false)
	public TipoImportancia getTipoImportancia() {
		return this.tipoImportancia;
	}

	public void setTipoImportancia(TipoImportancia tipoImportancia) {
		this.tipoImportancia = tipoImportancia;
	}

	@ManyToOne
	@JoinColumn(name = "from_id", nullable = false)
	public Usuario getUsuario() {
		return this.usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	@Column(name = "titulo_aviso", nullable = false, length = 100)
	public String getTituloAviso() {
		return tituloAviso;
	}

	public void setTituloAviso(String tituloAviso) {
		this.tituloAviso = tituloAviso;
	}

	@Column(name = "texto_aviso", nullable = false, length = 500)
	public String getTextoAviso() {
		return this.textoAviso;
	}

	public void setTextoAviso(String textoAviso) {
		this.textoAviso = textoAviso;
	}

	@Column(name = "url", length = 1024)
	public String getUrl() {
		return this.url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_activacion", length = 19)
	public Date getFechaActivacion() {
		return this.fechaActivacion;
	}

	public void setFechaActivacion(Date fechaActivacion) {
		this.fechaActivacion = fechaActivacion;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha_baja", length = 19)
	public Date getFechaBaja() {
		return this.fechaBaja;
	}

	public void setFechaBaja(Date fechaBaja) {
		this.fechaBaja = fechaBaja;
	}

	@OneToMany(mappedBy = "aviso")
	public Set<UsuarioAviso> getDestinatarios() {
		return this.destinatarios;
	}

	public void setDestinatarios(Set<UsuarioAviso> destinatarios) {
		this.destinatarios = destinatarios;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((fechaActivacion == null) ? 0 : fechaActivacion.hashCode());
		result = prime * result + ((textoAviso == null) ? 0 : textoAviso.hashCode());
		result = prime * result + ((tipoAviso == null) ? 0 : tipoAviso.hashCode());
		result = prime * result + ((tipoImportancia == null) ? 0 : tipoImportancia.hashCode());
		result = prime * result + ((tituloAviso == null) ? 0 : tituloAviso.hashCode());
		result = prime * result + ((usuario == null) ? 0 : usuario.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Aviso other = (Aviso) obj;
		if (fechaActivacion == null) {
			if (other.fechaActivacion != null)
				return false;
		}
		else if (!fechaActivacion.equals(other.fechaActivacion))
			return false;
		if (textoAviso == null) {
			if (other.textoAviso != null)
				return false;
		}
		else if (!textoAviso.equals(other.textoAviso))
			return false;
		if (tipoAviso == null) {
			if (other.tipoAviso != null)
				return false;
		}
		else if (!tipoAviso.equals(other.tipoAviso))
			return false;
		if (tipoImportancia == null) {
			if (other.tipoImportancia != null)
				return false;
		}
		else if (!tipoImportancia.equals(other.tipoImportancia))
			return false;
		if (tituloAviso == null) {
			if (other.tituloAviso != null)
				return false;
		}
		else if (!tituloAviso.equals(other.tituloAviso))
			return false;
		if (usuario == null) {
			if (other.usuario != null)
				return false;
		}
		else if (!usuario.equals(other.usuario))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return new ToStringBuilder(this).append("id", id).append("tipoAviso", tipoAviso)
				.append("tipoImportancia", tipoImportancia).append("usuario", usuario)
				.append("tituloAviso", tituloAviso).append("textoAviso", textoAviso).append("url", url)
				.append("fechaActivacion", fechaActivacion).append("fechaBaja", fechaBaja).toString();
	}

}
